//一个类似消消乐的小游戏，通过2,4,6,8来控制上下左右滑动，相同的数字可以相加变为新的数字，并获得相应分数
//到无法再移动消除数字时游戏结束
//7 8 9
//4 5 6
//1 2 3
//8为上移，2为下移，4为左移，6为右移。
#include<bits/stdc++.h>
#include<conio.h>
#define xx x&-x
using namespace std;
void print(int x){
	if(x<0)putchar('-'),x=-x;
	if(x<10){putchar(x+'0');return;}
	print(x/10);
	putchar(x%10+'0');
}
const int N=1e6+5;
const int M=1e3+5;
int n,m,k;
int T;
int f[N];
int a[N];
int c[M][M];
//        0 1 2 3  4  5  6
int p[N]={2,4,8,16,32,64,128};
int ans;
int cnt=3;
void init(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(c[i][j]==0){
				c[i][j]=p[rand()%cnt];//随机给定一个数
				return;
			}
		}
	}
}
bool check(){//判断游戏是否结束
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(!c[i][j])return 1;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(c[i][j]==c[i-1][j]||c[i][j]==c[i+1][j]||c[i][j]==c[i][j-1]||c[i][j]==c[i][j+1])return 1;
		}
	}
	return 0;
}
void checks(){
	int mx=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			mx=max(mx,c[i][j]);
		}
	}
	if(mx==256)cnt=4;
	if(mx==512)cnt=5;
	if(mx==1024)cnt=6;
}
signed main(){
	srand(time(0));
	n=4;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			c[i][j]=0;
		}
	}
	int ppp=1;
	while(1){
		system("cls");
		cout<<"Score:"<<ans<<'\n';
		if(ppp)init();
		else ppp=1;
		if(!check())break;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(c[i][j]/100000==0)cout<<' ';
				if(c[i][j]/10000==0)cout<<' ';
				if(c[i][j]/1000==0)cout<<' ';
				if(c[i][j]/100==0)cout<<' ';
				if(c[i][j]/10==0)cout<<' ';
				if(c[i][j])cout<<c[i][j];
				else cout<<'.';
			}
			cout<<'\n';
		}
		char op;
		op=getch();
		int flag=0;
		if(op=='8'||op=='w'){//上移
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					int p=c[i][j];
					for(int k=i-1;k>=1;k--){
						if(c[k][j]==0){c[k][j]=c[k+1][j],c[k+1][j]=0;continue;}
						if(c[k][j]!=p)break;
						else c[k][j]=c[k][j]*2,c[k+1][j]=0,flag+=c[k][j]/2;
					}
				}
			}
		}
		else if(op=='2'||op=='s'){//下移
			for(int i=n;i>=1;i--){
				for(int j=1;j<=n;j++){
					int p=c[i][j];
					for(int k=i+1;k<=n;k++){
						if(c[k][j]==0){c[k][j]=c[k-1][j],c[k-1][j]=0;continue;}
						if(c[k][j]!=p)break;
						else c[k][j]=c[k][j]*2,c[k-1][j]=0,flag+=c[k][j]/2;
					}
				}
			}
		}
		else if(op=='4'||op=='a'){//左移
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					int p=c[i][j];
					for(int k=j-1;k>=1;k--){
						if(c[i][k]==0){c[i][k]=c[i][k+1],c[i][k+1]=0;continue;}
						if(c[i][k]!=p)break;
						else c[i][k]=c[i][k]*2,c[i][k+1]=0,flag+=c[i][k]/2;
					}
				}
			}
		}
		else if(op=='6'||op=='d'){//右移
			for(int i=1;i<=n;i++){
				for(int j=n;j>=1;j--){
					int p=c[i][j];
					for(int k=j+1;k<=n;k++){
						if(c[i][k]==0){c[i][k]=c[i][k-1],c[i][k-1]=0;continue;}
						if(c[i][k]!=p)break;
						else c[i][k]=c[i][k]*2,c[i][k-1]=0,flag+=c[i][k]/2;
					}
				}
			}
		}
		else ppp=0;
		checks();
		ans+=flag;//计分
	}
	cout<<"END!\nScore:"<<ans<<'\n';
}

